package com.cskaoyan.javase.oop1._16access._3why;

/**
 * 给类或者类中结构加上访问权限，就相当于给房子加锁，没有钥匙（没有访问权限）就进不去（访问不到）
 * 但以上说的是正常情况
 * 房子的锁是可以撬开，是可以强行打破的，同样的访问权限符也不是绝对不可破解的。
 * 比如Java自身就提供了反射的特性，反射是可以破解访问权限的。
 * 那么就像给门加锁，是警告你不能逾越界限，否则就是违法操作一样。
 * 访问权限的使用，最基本的，自然是用来控制访问权限的（这是废话）。
 *      但也隐含了警告和暗示的作用：
 * 告诉代码的使用者，哪些地方不要触碰，哪些地方应该使用。起到警告、约束和指导代码使用者的功能。
 * 具体来说,对于代码当中private修饰的,以及没有访问权限的地方,既然没有权限,那就不要关心,不要去查看,也不要去使用
 * 而代码当中public修饰的,以及有访问权限的地方,这是鼓励你使用,希望你了解,推荐你查看.
 *
 * 接下来,我们看一些具体的案例:
 *      1.工具类,该类下的所有方法都是静态方法,全部都可以用类名点直接调用
 *          常见的工具类: Math,Arrays,Collections,Objects....
 *          这个类的对象是毫无意义的,完全没有必要使用它的对象
 *          于是,为了指导代码使用者,干脆禁止创建对象
 *          私有化构造器
 *          任何工具类,必不可少的一步,私有化构造器
 *
 *      2.中间方法,过程方法,这种类型的方法是不会提供给外界使用的,应该私有化它(非常重要的原则)
 *      3.某些设计模式,比如单例的设计模式,工厂的设计模式
 *
 * 如果遵循上述原则,严格让访问权限来指导代码的使用者,好处是什么呢?
 * 如果你能够严格按照上述描述使用访问权限修饰符，那么好处是显而易见的：
 *      把代码的开发者和代码的使用者给区分开来了：
 * 代码使用者无需关心没有访问权限的代码，仅需要关心具有访问权限的部分就可以了。节省了很大的精力
 *      私有或者没有访问权限的部分，既然不让我看，不让我用，那我就老老实实不看，不用。
 *      实际上，当你去使用别人的代码时，你也不希望需要完全读懂所有代码，才能够使用吧？
 *
 * 代码开发者，可以自由的开发，对外界没有访问权限部分的代码。
 *      这些私有的，或者对外界不可见部分的代码，叫做隐藏代码的具体实现细节，可以很方便的修改代码实现。
 *      想一想，如果一个方法是public修饰的，在外界多处被使用，你敢随便就动这个方法代码吗？
 *
 * 那么对于程序员而言,如何使用访问权限修饰符呢?原则是什么呢?
 *      1.尽量私有化，方便自己修改代码，隐藏实现细节。
 *      2.如果不能私有化，那也应该尽量少的给予访问权限，先从默认权限开始考虑。
 *      3.只有确定这个结构，一定需要在外部（尤其是不同包下）被访问时，才考虑给public，尽量少给public。
 *          权限这个东西，要吝啬，不要"大方"！
 *
 * @since 15:05
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        A.test();
    }


}

class A {
    // test方法是为了实现功能,提供给外界使用的方法
    public static void test() {
        test2();
    }
    // test2方法是为了实现test方法的中间方法,过程方法,这种类型的方法不会提供给外界使用,应该私有化它
    // Access can be private 访问权限可以私有化
    private static void test2() {
    }
}